A matrix strategy lets you fork a single target into multiple differentvariants, based on parameters that you specify. This works in a similar way toMatrix strategies for GitHub Actions.You can use this to reduce duplication in your Bake definition.
The matrix attribute is a map of parameter names to lists of values. Bakebuilds each possible combination of values as a separate target.
Each generated target must have a unique name. To specify how target namesshould resolve, use the name attribute.
The following example resolves the app target to app-foo and app-bar. Italso uses the matrix value to define thetarget build stage.
target "app" { name = "app-${tgt}" matrix = {tgt = ["foo", "bar"] } target = tgt}$ docker buildx bake --print app[+] Building 0.0s (0/0){ "group": {"app": { "targets": ["app-foo","app-bar" ]},"default": { "targets": ["app" ]} }, "target": {"app-bar": { "context": ".", "dockerfile": "Dockerfile", "target": "bar"},"app-foo": { "context": ".", "dockerfile": "Dockerfile", "target": "foo"} }}Multiple axesYou can specify multiple keys in your matrix to fork a target on multiple axes.When using multiple matrix keys, Bake builds every possible variant.
The following example builds four targets:
app-foo-1-0app-foo-2-0app-bar-1-0app-bar-2-0target "app" { name = "app-${tgt}-${replace(version, ".", "-")}" matrix = {tgt = ["foo", "bar"]version = ["1.0", "2.0"] } target = tgt args = {VERSION = version }}Multiple values per matrix targetIf you want to differentiate the matrix on more than just a single value, youcan use maps as matrix values. Bake creates a target for each map, and you canaccess the nested values using dot notation.
The following example builds two targets:
app-foo-1-0app-bar-2-0target "app" { name = "app-${item.tgt}-${replace(item.version, ".", "-")}" matrix = {item = [ {tgt = "foo"version = "1.0" }, {tgt = "bar"version = "2.0" }] } target = item.tgt args = {VERSION = item.version }}